/******************************************************************************
 * @file bsp_led_driver.h
 * @brief 文件功能简述
 *
 * 详细描述：
 * - 功能1：具体描述
 * - 功能2：具体描述
 * - ...
 *
 * @author 作者名
 * @date 创建日期 (例如: 2024-10-18)
 * @version 版本号 (例如: 1.0.0)
 *
 * @note 备注信息 (可选)
 * @warning 警告信息 (可选)
******************************************************************************/
#ifndef _BSP_LED_DRIVER_H__
#define _BSP_LED_DRIVER_H__

/******************************** Includes ***********************************/
#include <stdio.h>
#include <stdint.h>
/******************************** Includes ***********************************/

/******************************** Defines  ***********************************/
#define INITED                   1       //LED is inited
#define NOT_INITED               0       //LED is inited

#define OS_SUPPORTING                    //OS_SUPPORTING depending on OS avaliable
#define DEBUG                            //Enable debug
#define DEBUG_OUT(X)    printf(X)        //DEBUG output infoto indicate statues

typedef enum
{
    LED_OK                  =   0,     // 表示LED操作成功。
    LED_ERROR               =   1,     // 表示LED操作中出现了一般错误。
    LED_ERROR_TIMEOUT       =   2,     // 表示LED操作超时。
    LED_ERROR_RESOURCES     =   3,     // 表示资源不足，无法完成LED操作。
    LED_ERROR_PARAMETER     =   4,     // 表示传入的参数无效。
    LED_ERROR_NOMEMORY      =   5,     // 表示内存不足，无法完成LED操作。
    LED_ERROR_ISR           =   6,     // 表示ISR（中断服务例程）中发生了错误。
    LED_ERROR_BUSY          =   7,     // 表示LED忙，无法执行操作。
    LED_ERROR_RESERVED      =   0XFF,  // 保留的错误码，用于未来扩展。
} led_status_t;

typedef enum
{
	PROPORTION_1_3            =   0,    /*LED Operation completed successfully.*/
	PROPORTION_1_2            =   1,    /*LED Operation completed successfully.*/
	PROPORTION_1_1            =   2,    /*LED Operation completed successfully.*/
	PROPORTION_x_x            =   0xFF, /*LED Operation completed successfully.*/
}proportion_t;

typedef struct 
{
    led_status_t (*pf_led_on)       (void);/*LED Operation completed successfully.*/
    led_status_t (*pf_led_off)      (void);/*LED Operation completed successfully.*/
}led_operations_t;

typedef struct 
{
    led_status_t (*pf_get_time_ms) (uint32_t * const);/*LED Operation .*/
}time_base_ms_t;

#ifdef OS_SUPPORTING
typedef struct 
{
    led_status_t (*pf_os_delay_ms) ( const uint32_t );/*LED Operation .*/
}os_delay_t;
#endif //OS_SUPPORTING

typedef led_status_t (*pf_led_control_t)(
                                        uint32_t ,      //cycle_time_ms
                                        uint32_t ,      //blink_times 
                                        proportion_t   //proportion_on_off
                                              ) ;      
typedef struct
{
    /**************Target of IOS needed************/
     uint8_t                              is_inited;
    /**************Target of Features**************/
	/*The whole time of blink*/
	 uint32_t                         cycle_time_ms;
	/*The times of blink*/
	 uint32_t                           blink_times;
	/*The relationship of light on and off*/ 
	 uint32_t                     proportion_on_off;

    /**************Target of IOS needed************/

    /******The Interface from Core layer          */
     led_operations_t              *p_led_opes_inst;
     time_base_ms_t                 *p_time_base_ms;
 #ifdef OS_SUPPORTING    
    /******The Interface from OS layer          */
     os_delay_t                    *p_os_time_delay;
 #endif //OS_SUPPORTING

    /**************Target of APIs******************/
     pf_led_control_t              pf_led_controler;	
}bsp_led_driver_t;


/******************************** Defines  ***********************************/
/******************************** Declaring  ***********************************/
/**
 * @brief Instantiate the target of bsp_led_driver_t
 * 
 * 本函数用于控制指定LED的闪烁行为，包括闪烁周期、闪烁次数以及亮灭比例
 * 
 * @param self LED处理器的实例指针，用于访问LED处理器的成员变量和函数
 * @param Cycle_time 闪烁周期，单位为毫秒，表示一次完整的亮灭循环所需时间
 * @param blink_times 闪烁次数，表示LED将重复闪烁的次数
 * @param proportion_on_off 亮灭比例，表示在一个闪烁周期内亮起和熄灭时间的比例
 * @param index LED索引，用于指定需要控制的LED
 * 
 * @return led_handler_status_t 返回LED处理器的状态码，表示函数执行结果
 *
 **/
led_status_t led_driver_inst(
                                     bsp_led_driver_t *   const       self,
                                     led_operations_t *   const    led_ops,
 #ifdef OS_SUPPORTING                              
                                     os_delay_t       *   const   os_delay,
 #endif //OS_SUPPORTING
                                     time_base_ms_t   *   const  time_base
                               
                               );
/******************************** Declaring  ***********************************/

#endif //End of __BSP_LED_DRIVER_H__

